package org.layui.shop.controller;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Part;

import java.io.File;
import java.io.IOException;

/**
 * 上传头像 - 使用原生 Part 对象上传
 *
 * @author ZQX
 * @date 2024-12-03
 */
@WebServlet("/upload_head.do")
@MultipartConfig
public class UploadHeadServlet extends BaseController {
    @Override
    public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");

        // 1.获取表单中输入的数据
        // 非 file 控件，都使用 req.getParameter()
        // 方法获取相关的数据

        // file 控件，都使用 req.getPart("参数") / req.getParts()
        // 方法获取上传文件的 Part 对象
        // 注意：在 Servlet 中，默认是不开启文件上传功能的
        // 在 Servlet 中，通过使用注解（@MultipartConfig）开启上传功能
        Part part = req.getPart("head_img");


        // 会话对象
        // HttpSession session = req.getSession();
        // 上下文对象
        ServletContext servletContext = req.getServletContext();
        String realPath = servletContext.getRealPath("/upload/");

        // 创建 update 文件夹 - 不存在才创建
        File file = new File(realPath);
        if (!file.exists()) {
            file.mkdir();
        }

        // 1.获取上传文件原来的文件名称
        // 使用某种算法，生成唯一的文件名，防止文件被覆盖
        // 如：时间（精确到纳秒）、UUID ...
        String fileName = part.getSubmittedFileName();

        // 3.获取上传文件的后缀（扩展名）
        // String ext = fileName.substring(fileName.indexOf("."));

        // 4.上传文件大小 - 默认单位是字节（byte）
        // 1 MB = 1024 KB
        // 1 KB = 1024 byte
        // 1 MB = 1 * 1024 * 1024 byte
        long size = part.getSize();

        // 最多只能上传 200KB 的文件
        if (size > 200 * 1024) {
            throw new RuntimeException("上传文件不能超过 200KB");
        }

        // 5.文件上传 - part.write(路径 + 文件名)
        // 注意：必须保证上传文件名称唯一，否则后者把前者覆盖
        part.write(realPath + fileName);

        // Service - DAO 处理...(略)
        // 响应结果 - code(0)
        print(res, success(0, null, "success"));
    }
}
